AWS Glueを使ってコードを書かずにSalesforceへのリバースETLをやってみた

AWS Glueを使ってコードを書かずにSalesforceへのリバースETLをやってみた

GlueはSalesforceのネイティブコネクタをサポートしています
Clock Icon2024.12.19

データ事業本部インテグレーション部機械学習チーム・新納(にいの)です。

本記事は毎年恒例AWS Analytics Advent Calendar 2024の19日目のエントリです。

2024年5月、AWS GlueでSalesforceコネクタがサポートされたと発表されました。このアップデートにより、GlueのビジュアルエディタでSalesforceに簡単に接続できるようになりました!

https://aws.amazon.com/jp/about-aws/whats-new/2024/05/aws-glue-saas-salesforce-connector/

うれしいことにデータを読み込むのはもちろんのこと、Salesforceへデータを書き出すこともできます。いわゆるリバースETLも実現可能になりました。

というわけでGlue Stuidoのビジュアルエディタを利用し、コードを書かずにSalesforceへのリバースETLを試してみました。

リバースETLとは

データウェアハウスやデータレイクに集約されたデータをSaaS等の運用システムに書き戻して活用するプロセスをリバースETLと呼びます。従来のETL(Extract, Transform, Load)はSaaS等のデータをデータ分析基盤にロードするプロセスですが、この逆の流れを実現します。

営業部門で使っているSalesforceを例に考えてみましょう。顧客情報を分析した結果、「このお客様は新しい商品に興味を持ちそう」「このお客様はサービスの解約を考えているかもしれない」といった発見が得られたとします。

このような分析結果をSalesforceに自動で反映できれば、営業担当者は「このお客様に連絡したほうが良さそうだな」とすぐに分かります。このように、リバースETLを活用することでデータ分析の結果を日々の業務に活かし、より効果的な施策につなげられるという利点があります。

想定シナリオ

今回の構成は以下の通りです。S3上のファイルをSalesforceへ連携します。

20241219_salesforce_reverse_salesforce_overview

以下のようなユースケースを考えています。

  • Salesforceの取引先オブジェクトの評価(Hot/Warm/Cold)をアップデートする
    • 顧客分析の結果、取引先の評価を定期的にアップデートしたい
  • 対応するIDと評価はCSVファイルでS3バケットに連携される
  • CSVファイルをAWS Glueを使ってSalesforceへUPSERTする

リバースETLする前のSalesforceの取引先オブジェクトは以下の通り、評価が空欄になっています。この項目をジョブ実行によってアップデートします。

20241219_salesforce_reverse_accounts_before

事前準備:Salesforce側で外部IDを設定

今回のユースケースでは取引先情報をUPSERTするため、Glue側で外部IDの指定が必須となります。今回の検証では取引先に新しく外部IDを作成しました。

SalesforceでオブジェクトマネージャーからリバースETLの対象(今回は取引先)を選択し、「項目とリレーション」から「新規」へ遷移します。

20241219_salesforce_reverse_accounts_externalid1

テキストを選択します。

20241219_salesforce_reverse_accounts_externalid2

表示ラベル、文字数、項目名それぞれの必須項目に任意の値を設定し、「外部システムの一意のレコード識別子として設定する」チェックボックスを有効にします。

20241219_salesforce_reverse_accounts_externalid3

最終画面まで遷移し、保存します。

20241219_salesforce_reverse_accounts_externalid4

「項目とリレーション」画面から外部IDとして設定した項目を確認できるようになりました。項目名にcが付いたもの(今回はExternalID__c)を連携するファイル内とGlueでの設定時に利用するので覚えておいてください。

20241219_salesforce_reverse_accounts_externalid5

取引先の画面に移動し、外部IDを設定可能です。

20241219_salesforce_reverse_externalid-edit

事前準備:データアップデート用CSVファイルをS3バケットに配置

以下のCSVファイルを作成しました。外部IDのカラム名は__cで終わる項目名を指定する必要があります。このIDをキーとして一致するオブジェクトを更新します。Ratingは取引先オブジェクトの「評価」項目に反映されます。

ExternalID__c,Rating
ACC001,Hot
ACC002,Warm
ACC003,Hot
ACC004,Cold
ACC005,Warm
ACC006,Hot
ACC007,Warm
ACC008,Hot
ACC009,Warm
ACC010,Cold

このファイルを任意のS3バケット上に配置します。

GlueでSalesforceコネクタを作成

以下の手順に沿ってSalesforceコネクタをAWS Glueで作成します。

https://docs.aws.amazon.com/glue/latest/dg/salesforce-setup-authorization-code-flow.html

大雑把にまとめると、以下を実施します。

  • Salesforce側で接続アプリケーションを作成し、コンシューマーシークレットを生成
  • Secrets Managerにコンシューマーシークレットをストア
  • GlueでSalesforceコネクタを設定

Salesforceでコンシューマーシークレットを生成

まずはSalesforceでコンシューマーシークレットを取得します。

アプリケーションマネージャーから「新規接続アプリケーション」へ移動します。

20241219_salesforce_reverse_salesforce_connectapp1

「接続アプリケーションを作成」を選びます。

20241219_salesforce_reverse_salesforce_connectapp2

接続アプリケーション名、API参照名、取引先責任者メールに任意の値を設定します。ここで指定したメールアドレスは認証に利用されます。

20241219_salesforce_reverse_salesforce_connectapp3

「OAuth設定の有効化」を有効にし、以下の通り設定します。

設定項目
コールバックURL https://<Glueのリージョン>.console.aws.amazon.com/gluestudio/oauth
選択したOAuth範囲 - APIを使用してユーザーデータを管理(api)
- ID URLサービスにアクセス(id,profile,email,address,phone)
- いつでも要求を実行(refresh_token,offline_access)
- カスタム権限にアクセス(custom_permissions)
- 一意のユーザー識別子にアクセス(openid)
サポートされる認証フローにPKCE拡張を要求 有効化
Webサーバーフローの秘密が必要 有効化
更新トークンフローの秘密が必要 有効化

20241219_salesforce_reverse_salesforce_connectapp4

保存すると以下のような画面に遷移します。「コンシューマーの詳細を管理」へアクセスします。このとき、取引先責任者メールに指定したアドレスへ認証コードが送られます。

20241219_salesforce_reverse_salesforce_connectapp_getsecret

「コンシューマーの秘密」をコピーしておきます。

20241219_salesforce_reverse_salesforce_connectapp_getsecret2

Secrets Managerにストア

先ほどコピーした「コンシューマーの秘密」をSecrets Managerに保存します。キー名は必ずUSER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRETを設定してください。

20241219_salesforce_reverse_salesforce_connectapp_addsecretmanager

GlueでSalesforceコネクタを設定

ここまでくれば、あとはGlueでコネクタを設定するだけです。Data Connectionsから新規コネクタ作成画面へ移動し、Data SourceにSalesforceを選びます。

20241219_salesforce_reverse_connection1

Connection Detailsでは以下を設定します。

設定項目
Instance URL SalesforceのインスタンスURL(例:https://example.my.salesforce.com
Salesforce environment Salesforceの環境(ProductionもしくはSandbox)
IAM service role 前項で設定したSecrets ManagerへアクセスできるIAMロール

20241219_salesforce_reverse_connection2

他にはJWT認証もありますが、今回は認証方式として「Authorization Code」を利用します。AWS Secretには前項で設定したSecrets Managerをドロップダウンリストから選択します。

20241219_salesforce_reverse_connection3

最後にTest Connectionから接続テストを実施し、接続が確認できれば保存して終了です。

Glue StudioでリバースETLジョブを作成・実行

Glue StudioからVisual ETLを選択し、ビジュアルエディタからフローを作成します。

データソースにはAmazon S3ノードを配置し、CSVファイルを置いたS3バケットを指定します。データフォーマットはCSVで、必要に応じてデリミタやクォーテーションを設定します。

20241219_salesforce_reverse_source_s3

S3ノードに接続し、データターゲットはSalesforceを選択します。Entity NameにはUPSERT対象となるSalesforceオブジェクト(今回は取引先)、Write OperationにはUPSERTを指定します。

Id field namesには外部ID(今回はExternalID__c)を指定します。この項目はUPSERT・UPDATEを実施する際は必須です。ソースのCSVファイルとID名が異なる場合にはエラーとなります。

20241219_salesforce_reverse_destination

ジョブを保存して実行します。今回はGlueのバージョンを4.0に指定しました。

実行後、Salesforceを確認するとこれまで空欄だった評価欄にCSVで指定した値が反映されていることが確認できました。

20241219_salesforce_reverse_accounts_after

最後に

AWS Glueを使ってSalesforceへのリバースETLを実施しました。ビジュアルエディタを利用しても実態はSparkのコードが裏側で生成されていますが、コードを使って実装することなくリバースETLジョブを作成できました。AppFlowでもSalesforceへの書き込みがサポートされていますが、GlueはData Catalogをデータソースとして指定することもできますし、生成されたSparkを編集すればより柔軟な条件での実装も可能です。AppFlowとはまた違った良さがありますね。

この記事がどなたかのお役に立てば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.